/**
 * 
 */
package utils;

import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Méthode contenant des méthodes utiles pour les chaînes de caractères
 * @author Aubry Pirian
 *
 */
public class StrUtils {
	
	// Nombre de jours pour chaque mois
	private static int[] MONTH_DAYS = {0,31,29,31,30,31,30,31,31,30,31,30,31}; 
	
	
	/**
	 * Vérifie une expression régulière sur une chaîne
	 * @param s	: chaîne à vérifier
	 * @param p	: expression régulière
	 * @return	: true/false
	 */
	public static boolean checkPattern (String s, String p) {
		Pattern pattern = Pattern.compile(p);
		Matcher matcher = pattern.matcher(s);
		return matcher.find();
	}
	
	/**
	 * Vérifie si une chaîne contient uniquement des chiffres, lettres ou '_'
	 * @param s : chaîne à vérifier
	 * @return	: true/false
	 */
	public static boolean isNodeName (String s) {
		return checkPattern(s,"(\\w*)");
	}
	
	
	/**
	 * Vérifie si une chaîne est dans un tableau de chaînes
	 * @param array : tableau
	 * @param s		: chaîne
	 * @param caseSensitive : sensible à la casse
	 * @return		: true/false
	 */
	public static boolean inArray (String[] array, String s, boolean caseSensitive) { 
		int c = array.length;
		if (caseSensitive) {
			for (int i=0; i<c; i++) {
				if (array[i].equals(s)) return true;
			}
		} else {
			for (int i=0; i<c; i++) {
				if (array[i].equalsIgnoreCase(s)) return true;
			}
		}
		return false;
	}
	
	/**
	 * Vérifie si un caractère est "identique" à une des chaînes dans un tableau de chaînes
	 * @param array : tableau
	 * @param c		: caractère
	 * @param caseSensitive : sensible à la casse
	 * @return		: true/false
	 */
	public static boolean inArray (String[] array, char c, boolean caseSensitive) {
		return StrUtils.inArray(array, ""+c, caseSensitive);
	}
	
	
	/**
	 * Parse une liste au format : '','','',''
	 * @param list	: chaîne de caractères
	 * @return		: un tableau de chaînes de caractères
	 */
	public static String[] parseList(String list) {
		String[] v = list.split(",");
		int c = v.length;
		for (int i=0; i<c; i++) {
			int l = v[i].length();
			v[i] = v[i].substring(1,l-1);
		}
		return v;
	}
	
	
	/**
	 * strReplace
	 * @param s chaîne à traiter
	 * @param s1 chaîne à remplacer
	 * @param s2 chaîne remplaçante
	 */
	public static String strReplace(String s, String s1, String s2) {
		String[] a = s.split(s1);
		int al = a.length;
		if (al==0) return s;
		s=a[0];
		if (al>0) {
			for (int i=1; i<al; i++) {
				s += s2+a[i];
			}
		}
		return s;
	}
	
	
	/**
	 * Retourne un date au format SQL (YYYY-MM-DD HH:mm:ss) à partir d'un HashMap
	 * @param date HashMap contenant:
	 * 		year	-> année
	 * 		month	-> mois
	 * 		day		-> jour
	 * 		hours	-> heures
	 * 		minutes -> minutes
	 * 		seconds -> secondes 
	 * @return la date au format SQL (YYYY-MM-DD HH:mm:ss)
	 */
	public static String toSQLDate(HashMap<String,Integer> date) {
		String s = "";
		int i;
		if (date.containsKey("year")) {
			i = date.get("year");
			if (i<1000) s += "0";
			if (i<100) s += "0";
			if (i<10) s += "0";
			s += i;
		} else s += "0000";
		s += "-";
		if (date.containsKey("month")) {
			i = date.get("month");
			if (i>12) {
				date.put("month",i-12);
				date.put("year",date.get("year")+1);
				return toSQLDate(date);
			}
			if (i<10) s += "0";
			s += i;
		} else s += "00";
		s += "-";
		if (date.containsKey("day")) {
			i = date.get("day");
			if (i>MONTH_DAYS[date.get("month")]) {
				date.put("day",i-MONTH_DAYS[date.get("month")]);
				date.put("month",date.get("month")+1);
				return toSQLDate(date);
			}
			if (i<10) s += "0";
			s += i;
		} else s += "00";
		s += " ";
		if (date.containsKey("hours")) {
			i = date.get("hours");
			if (i>24) {
				date.put("hours",i-24);
				date.put("day",date.get("day")+1);
				return toSQLDate(date);
			}
			if (i<10) s += "0";
			s += i;
		} else s += "00";
		s += ":";
		if (date.containsKey("minutes")) {
			i = date.get("minutes");
			if (i>60) {
				date.put("minutes",i-60);
				date.put("hours",date.get("hours")+1);
				return toSQLDate(date);
			}
			if (i<10) s += "0";
			s += i;
		} else s += "00";
		s += ":";
		if (date.containsKey("seconds")) {
			i = date.get("seconds");
			if (i>60) {
				date.put("seconds",i-60);
				date.put("minutes",date.get("minutes")+1);
				return toSQLDate(date);
			}
			if (i<10) s += "0";
			s += i;
		} else s += "00";
		return s;
	}

}
